package org.example.ExperimentFour.Third;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class ApiDocumentGenerator {
    // 自定义字段描述注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ApiModelProperty {
        String value();
    }
    // 自定义请求方法注解
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PostMapping {
        String value();
    }
    // 用户请求参数DTO
    public static class UserDTO {
        @ApiModelProperty("用户id")
        private Integer userId;

        @ApiModelProperty("用户名称")
        private String name;
    }
    // 用户响应参数VO
    public static class UserVO {
        @ApiModelProperty("用户id")
        private Integer userId;

        @ApiModelProperty("用户名称")
        private String Name;

        @ApiModelProperty("用户电话")
        private String phone;
    }
//请求地址
    @PostMapping("/get_user")
    public UserVO getUser(UserDTO dto) {
        UserVO vo = new UserVO();
        vo.userId = dto.userId;
        vo.Name = dto.name;
        vo.phone = "+1234567890"; // 假设电话是固定值
        return vo;
    }

    public static void main(String[] args) {
        Class<?> clazz = ApiDocumentGenerator.class;

        for (java.lang.reflect.Method method : clazz.getDeclaredMethods()) {
//            使用 method.isAnnotationPresent(PostMapping.class) 来检查每个方法是否带有 PostMapping 注解
//            请求地址和请求方法
            if (method.isAnnotationPresent(PostMapping.class)) {
                PostMapping postMapping = method.getAnnotation(PostMapping.class);
                System.out.println("地址: " + postMapping.value());
                System.out.println("方法: post");
//输出请求参数
                System.out.println("请求参数：");
//                调用getFieldDescriptions
                List<String> requestParams = getFieldDescriptions(method.getParameterTypes()[0]);
                for (String param : requestParams) {
                    System.out.println(param);
                }
//返回参数
                System.out.println("返回参数：");
                //                调用getFieldDescriptions
                List<String> responseParams = getFieldDescriptions(method.getReturnType());
                for (String param : responseParams) {
                    System.out.println(param);
                }

                System.out.println();
            }
        }
    }
//利用反射机制动态获取类的名称、父类、实现的接口、字段、方法等信息
    private static List<String> getFieldDescriptions(Class<?> clazz) {
//        描述列表list
        List<String> fieldDescriptions = new ArrayList<>();
//        获取请求参数和返回参数的字段
        for (Field field : clazz.getDeclaredFields()) {
//            使用 field.getAnnotation(ApiModelProperty.class) 来获取字段上的 ApiModelProperty 注解。
            if (field.isAnnotationPresent(ApiModelProperty.class)) {
                ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
//                将格式化后的描述信息添加到 fieldDescriptions 列表中
                String description = String.format("    %s    %s    %s",
                        field.getName(),
                        field.getType().getSimpleName(),
                        apiModelProperty.value());
                fieldDescriptions.add(description);
            }
        }
        return fieldDescriptions;
    }
}
